/*
内存分区

    常量区              常量        const
    静态全局区          函数外变量    静态     static 
    堆区                动态内存    malloc
    栈区                函数内变量

进程分配内存
内核空间    
    大小    1G 
    特性    所有进程都共享一个内核空间 用户空间使用内核的时候 需要申请


用户空间
    大小    0-3G
            虚拟内存
    特性    当一个进程创建了后 系统自动分配0-3G的用户空间

用户空间的分层

    栈空间      栈区

    文件映射区      当需要操作文件的时候 会将文件 映射到内存中 供CPU操作

    堆空间      动态内存

    BSS         没有初始化的 <数据段>

    数据段      静态全局区   

    代码段      常量区

    保留区

*/


#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int main(int argc, char const *argv[])
{
    // 创建单个内存
    int * val_1 = new int;
    *val_1 = 10;
    cout << "val_1 = " << *val_1 << endl;

    // 创建单个内存 并 初始化   可以直接在括号内写值 也可以直接在括号内 写变量
    int * val_2 = new int(15);
    cout << "val_2 = " << *val_2 << endl;

    int * val_3 = new int(*val_2);
    cout << "val_3 = " << *val_3 << endl;


    // 创建多个内存
    int * arr = new int[5];

    // 写入数据
    for (size_t i = 0; i < 5; i++)
    {
        arr[i] = i;
    }
    
    // 读取数据
    for (size_t i = 0; i < 5; i++)
    {
        cout << "arr = " << arr[i] << endl;
    }

    // 释放动态内存
    delete val_1;
    delete val_2;
    delete val_3;
    // 释放多个内存
    delete [] arr;
    return 0;
}



/*
<span style="font-size: 18px; color: red;">要记，面试会问</span>

1、`new/delete` 是 C++ 的关键字，`malloc/free` 是库函数。

2、`new` 在分配空间的同时可以进行初始化，`malloc` 不可以。 

3、`new` 分配的空间如果没有初始化，默认会初始化成 0；而 `malloc` 分配的空间如果没有初始化，里面都是随机值，需要自己手动调用 `memset` 或者 `bzero` 函数来清 0。

4、`new` 是根据类型分配的空间，而 `malloc` 是根据字节数分配空间的，需要自己调用 `sizeof()` 计算。

5、`new` 是要什么类型，返回的就是什么类型的指针；而 `malloc` 返回的都是 `void*`，需要自己强转成需要的类型。

6、`new` 在分配类对象空间的时候，会调用类的==构造函数==，`malloc` 不会。

7、`delete` 在释放类对象空间的时候，会调用类的==析构函数==，`free` 不会。
*/



/*
new/delete` 和 `malloc/free`  区别
    杨晓瑄 全对
引用和指针的区别
    孙佳妮 全对

默认参数的规则
    调用函数时 ， 传递了实参，就使用实参的值。
    没有传递实参时，使用默认值。

默认参数的注意事项
    靠右原则
    声明处提供 定义处不提供
*/

